#include "pile.h"
#include "carte.h"
#include "joueur.h"
#include "table.h"
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
//test dans le svn
using namespace std;

Pile::Pile()
{
    int i;
    for(i=1;i<=4;i++)
    {
        Carte *p=new Carte(i,7,0, false, false, false,0);
        pile.push_front(p);   //7
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,8,0, false, false, false,0));   //8
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,9,0, false, false, false,0));   //9
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,10,2, false, false, false,0));  //Valet
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,11,3, false, false, false,0));   //Dame
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,12,4, false, false, false,0));   //Roi
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,13,10, false, false, false,0));  //10
    }
     for(i=1;i<=4;i++)
    {
         pile.push_front(new Carte(i,14,11, false, false, false,0));    //As
    }
//Phase de mélange du jeu
    srand(time(NULL));
    for(i=0;i<31;i++)
    {
        list<Carte*>::iterator it;
        list<Carte*>::iterator ital;
        int k;
        it =pile.begin();
        for(k=1;k<i;k++){it++;} // it pointe sur la i-ème carte
        int alea=rand()%32;  //On choisit la carte avec laquelle permuter
        ital=pile.begin();
        for(k=1;k<alea;k++){ital++;} //Là on place l'itérateur au bon endroit
        Carte * aux= (*ital) ;
        *ital=*it;
        *it=aux;
    }

}

void Pile::afficher()
{
list<Carte*>::iterator it;
int i;
it=pile.begin();
if (pile.size()!=0)
{for(i=0;i<=pile.size()-1;i++)
{cout<<"valeur : " ;(*it)->affichevaleur(); cout<<" et couleur : "; (*it)->affichecouleur(); cout<<"  et numero : "<<i<<endl<<endl;
it++;}
}
}

void Pile::distribuer(int n, Joueur *j)
{
    int i;
    for (i=1;i<=n;i++)
        {
            list<Carte*>::iterator it;
            it=pile.begin();
            Carte *c=*it;
            j->ajouter_carte_au_pied (c);
            pile.pop_front();
        }
}

void Pile::distribution23(int n, Table t)  //on appelle la fonction avec le joueur qui commence et la table
{
    distribuer(2,(t.gettable())[n]);
    distribuer(2,(t.gettable())[(n+1) %4]);
    distribuer(2,(t.gettable())[(n+2) % 4]);
    distribuer(2,(t.gettable())[(n+3) % 4]);
    distribuer(3,(t.gettable())[n]);
    distribuer(3,(t.gettable())[(n+1) % 4]);
    distribuer(3,(t.gettable())[(n+2) % 4]);
    distribuer(3,(t.gettable())[(n+3) % 4]);
}


void Pile::distribution32(int n, Table t)  //on appelle la fonction avec le joueur qui commence et la table
{
    distribuer(3,(t.gettable())[n]);
    distribuer(3,(t.gettable())[(n+1) % 4]);
    distribuer(3,(t.gettable())[(n+2) % 4]);
    distribuer(3,(t.gettable())[(n+3) % 4]);
    distribuer(2,(t.gettable())[n]);
    distribuer(2,(t.gettable())[(n+1) %4]);
    distribuer(2,(t.gettable())[(n+2) % 4]);
    distribuer(2,(t.gettable())[(n+3) % 4]);
}

void Pile::distributionfinale(int n, int p, Table t)
{
    int i;
    for(i=0;i<=3;i++)
    {
        if (i!=p)
        {
            distribuer (3,(t.gettable())[i %4]);
        }
        else
        {
            distribuer(2,(t.gettable())[i %4]);
        }
    }
}

Carte* Pile::retournercarte()
{
    Carte *c=pile.front();
    return c;
}

void Pile::couper(int n)  // On suppose que n>3 et n<29    pile=nom de la pile^^(vecteur de pointeur sur cartes)
{
    list<Carte*> tmp1;
    list<Carte*> tmp2;
    list<Carte*>::iterator it;
    list<Carte*>::iterator it1;
    list<Carte*>::iterator it2;

    int i;
    it=pile.begin();
    for(i=0;i<=31;i++) //on coupe la pile dans deux listes.
    {
        if (i<n)
            {
                tmp1.push_back(*it);
            }
        else
            {
                tmp2.push_back(*it);
            }
    it++;}

    it=pile.begin();
    it1=tmp1.begin();
    it2=tmp2.begin();
    for(i=0;i<=31;i++) //on change chaque terme de la pile
    {
        if (i<(32-n)) //on met tmp2 d'abord
            {
                *it=*it2;
                it2++;
            }
        else //puis tmp1
            {
                *it=*it1;
                it1++;
            }
        it++;
    }
}

list<Carte*> Pile::getpile()
{
    return pile;
}

void Pile::ajoutcartepile(Carte* c)
{
    pile.push_back(c);
}
